#ifndef CONNECTIONPOOL_H
#define CONNECTIONPOOL_H

#include <queue>
#include <mutex>
#include <thread>
#include <atomic>
#include <functional>
#include <condition_variable>

#include "db.hpp"

/*
 * mysql连接池功能模块
 */
class ConnectionPool
{
public:
    // 单例模式,获取连接池实例
    static ConnectionPool *getConnectionPool();
    // 消费者从连接池中获取连接
    shared_ptr<MySQL> getMySQL();

private:
    // 单例模式-静态方法中构造静态对象时调用
    ConnectionPool();
    // 独立线程-负责生产连接
    void produceConnectionTask();
    // 独立线程-定时扫描队列中的空闲连接,进行释放
    void scannerConnectionTask();

private:
    queue<MySQL *> _connectionQue; // 储存mysql连接的队列
    mutex _queueMutex;             // 保证连接队列的线程安全
    atomic_int _connectionCnt;     // 记录所创建的连接的数量
    condition_variable _cv;        // 用于同步生产连接和消费连接线程
};

#endif